package com.cb2.algorithm.leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * <a href='https://leetcode.cn/problems/valid-anagram'>有效的字母异位词(Valid Anagram)</a>
 * <p>给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的字母异位词（字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语，并使用所有原字母一次。）。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1:
 *      输入: s = "anagram", t = "nagaram"
 *      输出: true
 *
 * 示例 2:
 *      输入: s = "rat", t = "car"
 *      输出: false
 *     </pre>
 * </p>
 * <p>
 *
 * <b>提示：</b>
 *     <ul>
 *         <li>1 <= s.length, t.length <= 5 * 10^4</li>
 *         <li>s 和 t 仅包含小写字母</li>
 *     </ul>
 * </p>
 * <b>进阶: 如果输入字符串包含 unicode 字符怎么办？你能否调整你的解法来应对这种情况？</b>
 *
 * @author c2b
 * @since 2025/2/7 10:59
 */
public class LC0242ValidAnagram_S {
    static class Solution {
        public boolean isAnagram(String s, String t) {
            // 如果s和t仅包含小写字母，可以使用长度为26的数组来统计字符
            return isAnagramOfLowercaseString(s, t);
            // 如果包含unicode字符，可以使用HashMap
            //return isAnagramOfUnicodeString(s, t);
        }

        private boolean isAnagramOfLowercaseString(String s, String t) {
            if (s.length() != t.length()) {
                return false;
            }
            int[] charCntArr = new int[26];
            for (char c : s.toCharArray()) {
                charCntArr[c - 'a']++;
            }
            for (char c : t.toCharArray()) {
                charCntArr[c - 'a']--;
            }
            for (int i : charCntArr) {
                if (i != 0) {
                    return false;
                }
            }
            return true;
        }

        private boolean isAnagramOfUnicodeString(String s, String t) {
            if (s.length() != t.length()) {
                return false;
            }
            Map<Character, Integer> charCntMap = new HashMap<>();
            for (char c : s.toCharArray()) {
                charCntMap.put(c, charCntMap.getOrDefault(c, 0) + 1);
            }
            for (char c : t.toCharArray()) {
                charCntMap.put(c, charCntMap.getOrDefault(c, 0) - 1);
            }
            for (Integer value : charCntMap.values()) {
                if (value != 0) {
                    return false;
                }
            }
            return true;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.isAnagram("anagram", "nagaram"));
        System.out.println(solution.isAnagram("rat", "car"));
    }
}
